/**
 * Frida基础测试脚本
 * 用于验证Frida环境是否正常工作
 */

console.log("\n" + "=".repeat(80));
console.log("Frida环境测试");
console.log("=".repeat(80));

// 测试1: 列出所有已加载的模块
console.log("\n[测试1] 列出所有已加载的SO库:");
console.log("-".repeat(80));

var modules = Process.enumerateModules();
console.log("总共加载了 " + modules.length + " 个模块\n");

var smsdkFound = false;
var relevantModules = [];

modules.forEach(function(module) {
    // 查找数美SDK相关的库
    if (module.name.indexOf("smsdk") !== -1 || 
        module.name.indexOf("shumei") !== -1 ||
        module.name.indexOf("crypto") !== -1) {
        relevantModules.push(module);
        console.log("✓ " + module.name);
        console.log("  基地址: " + module.base);
        console.log("  大小: 0x" + module.size.toString(16));
        console.log("");
        
        if (module.name.indexOf("smsdk") !== -1) {
            smsdkFound = true;
        }
    }
});

if (smsdkFound) {
    console.log("\n✅ 找到数美SDK库！");
} else {
    console.log("\n⚠️  未找到libsmsdk.so，可能尚未加载");
    console.log("   建议：在应用中触发数美SDK调用后再运行");
}

// 测试2: Java环境
console.log("\n" + "-".repeat(80));
console.log("[测试2] Java环境测试:");
console.log("-".repeat(80));

Java.perform(function() {
    console.log("✓ Java.perform 可以正常执行");
    
    try {
        // 尝试获取Android版本
        var Build = Java.use("android.os.Build");
        console.log("✓ Android版本: " + Build.VERSION.RELEASE.value);
        console.log("✓ SDK版本: " + Build.VERSION.SDK_INT.value);
        
        // 尝试获取应用包名
        var ActivityThread = Java.use("android.app.ActivityThread");
        var currentApplication = ActivityThread.currentApplication();
        if (currentApplication) {
            var context = currentApplication.getApplicationContext();
            var packageName = context.getPackageName();
            console.log("✓ 应用包名: " + packageName);
        }
        
        // 尝试查找数美SDK类
        try {
            var SmAntiFraud = Java.use("com.ishumei.smantifraud.SmAntiFraud");
            console.log("\n✅ 找到数美SDK Java类！");
            console.log("   类名: com.ishumei.smantifraud.SmAntiFraud");
            
            // 列出所有方法
            var methods = SmAntiFraud.class.getDeclaredMethods();
            console.log("\n   可用方法数量: " + methods.length);
            console.log("   部分方法:");
            for (var i = 0; i < Math.min(10, methods.length); i++) {
                console.log("     - " + methods[i].toString());
            }
        } catch (e) {
            console.log("\n⚠️  未找到数美SDK Java类");
            console.log("   这可能是正常的（如果SDK尚未初始化）");
        }
        
    } catch (e) {
        console.log("✗ Java环境测试失败: " + e);
    }
});

// 测试3: 内存读取测试
console.log("\n" + "-".repeat(80));
console.log("[测试3] 内存操作测试:");
console.log("-".repeat(80));

try {
    // 查找libcrypto.so中的AES相关函数
    var aesSetKey = Module.findExportByName("libcrypto.so", "AES_set_encrypt_key");
    if (aesSetKey) {
        console.log("✓ 找到 AES_set_encrypt_key @ " + aesSetKey);
    }
    
    var rsaEncrypt = Module.findExportByName("libcrypto.so", "RSA_public_encrypt");
    if (rsaEncrypt) {
        console.log("✓ 找到 RSA_public_encrypt @ " + rsaEncrypt);
    }
    
    var randBytes = Module.findExportByName("libcrypto.so", "RAND_bytes");
    if (randBytes) {
        console.log("✓ 找到 RAND_bytes @ " + randBytes);
    }
    
    console.log("\n✅ 内存操作测试通过！");
} catch (e) {
    console.log("✗ 内存操作测试失败: " + e);
}

// 总结
console.log("\n" + "=".repeat(80));
console.log("测试总结");
console.log("=".repeat(80));
console.log("");
console.log("✓ Frida环境正常");
console.log("✓ 可以访问Java层");
console.log("✓ 可以访问Native层");
console.log("");

if (smsdkFound) {
    console.log("✅ 数美SDK已加载，可以开始Hook！");
    console.log("");
    console.log("下一步:");
    console.log("  1. 停止此脚本 (Ctrl+C)");
    console.log("  2. 运行完整Hook脚本:");
    console.log("     frida -U -f <包名> -l hook_complete_flow.js --no-pause");
} else {
    console.log("⚠️  数美SDK尚未加载");
    console.log("");
    console.log("建议操作:");
    console.log("  1. 在应用中手动触发数美SDK调用");
    console.log("  2. 然后运行: frida -U <包名> -l hook_complete_flow.js");
}

console.log("\n" + "=".repeat(80) + "\n");


